/*
 * C++ Design Patterns: Singleton
 * Author: Jakub Vojvoda [github.com/JakubVojvoda]
 * 2016
 *
 * Source code is licensed under MIT License
 * (for more details see LICENSE)
 *
 */

#include <iostream>

/*
 * Singleton
 * has private static variable to hold one instance of the class
 * and method which gives us a way to instantiate the class
 */
class Singleton {
   public:
      // The copy constructor and assignment operator
      // are defined as deleted, which means that you
      // can't make a copy of singleton.
      //
      // Note: you can achieve the same effect by declaring
      // the constructor and the operator as private
      Singleton( Singleton const& ) = delete;
      Singleton& operator=( Singleton const& ) = delete;

      static Singleton* get() {
         if( !instance ) {
            instance = new Singleton();
         }
         return instance;
      }

      static void restart() {
         if( instance ) {
            delete instance;
         }
      }

      void tell() {
         std::cout << "This is Singleton." << std::endl;
         // ...
      }

      // ...

   private:
      Singleton() {}

      static Singleton* instance;
      // ...
};

Singleton* Singleton::instance = nullptr;

int main() {
   Singleton::get()->tell();
   Singleton::restart();

   return 0;
}
